package com.hspedu.single_;

/**
 * @Author Stringzhua
 * @Date 2024/3/5 19:31
 * description:
 *
 * 在javaSE标准类中,java.lang.Runtime就是经典的单例模式
 *
 * 饿汉式单例模式
 * 步骤[单例模式->饿汉式]
 * 优点:在类加载时,就创建了对象实例
 * 不存在线程安全问题
 * 缺点:
 * 饿汉式存在浪费资源的可能,可能造成创建了对象,但是没有使用.那么创建的对象资源就浪费了
 * 1.将构造器私有化
 * 2.在类的内部类直接创建对象(该对象是static)
 * 3.再提供一个公共static方法,返回girlFriend对象
 * 4.代码实现
 */
public class SingleTon01 {
    public static void main(String[] args) {
//        GirlFridend xh = new GirlFridend("小红");
//        GirlFridend xb = new GirlFridend("小白");

        //通过方法实现
        GirlFridend instance1 = GirlFridend.getInstance();
        System.out.println(instance1);
        GirlFridend instance2 = GirlFridend.getInstance();
        System.out.println(instance2);

        System.out.println(instance1 == instance2);//true

        System.out.println("GirlFridend.n1 = " + GirlFridend.n1);//饿汉式

//        Runtime
    }
}

//有一个类  GirlFriend
//只能有一个女朋友
class GirlFridend {
    private String name;
    public static int n1 = 100;
    //通常是重量级的对象

    //为了能够在静态方法种,返回girlFriend对象,需要将其修饰为static
    private static GirlFridend girlFridend = new GirlFridend("小红红");

    /*如何保障我们只能创建一个GirlFriend对象
     * 步骤:
     * 1.将构造器私有化
     * 2.在类的内部类直接创建
     * 3.再提供一个公共static方法,返回girlFriend对象
     * 4.代码实现
     * */
    private GirlFridend(String name) {
        System.out.println("构造器被调用~");
        this.name = name;
    }

    static GirlFridend getInstance() {
        //返回一个实例
        return girlFridend;
    }

    @Override
    public String toString() {
        return "GirlFridend{" +
                "name='" + name + '\'' +
                '}';
    }
}
